@file:Suppress("MemberVisibilityCanBePrivate", "unused", "UNUSED_PARAMETER",
	"NON_FINAL_MEMBER_IN_FINAL_CLASS"
)

package com.virtualightning.mvvm.base

import android.content.Intent
import android.os.Bundle
import android.view.Window
import android.view.WindowManager
import androidx.annotation.CallSuper
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.ViewModelStoreOwner
import kotlinx.coroutines.*
import org.greenrobot.eventbus.EventBus


/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/06/09 00:19:13
 *  Project : zxs-new
 *  DialogFragment 基类
 */
abstract class BaseDialogFragment<T>() : DialogFragment(), CoroutineScope by MainScope(), ComponentAware.IComponentSupport {
	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/9 7:15 PM
	// 抽象组件
	///////////////////////////////////////////////////////////////////////////
	val aware = ComponentAware(this)

	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/1/26 上午10:21 by CimZzz
	// 以下内容为:
	// 基于 Argument 的封装
	///////////////////////////////////////////////////////////////////////////
	inline fun <reified E> findArgument(key: String): E? {
		return arguments?.get(key) as? E
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/7 9:23 PM
	// 拦截 onActivityCreated 回调，做一些和 Activity 初始化相关的操作
	///////////////////////////////////////////////////////////////////////////
	override fun onActivityCreated(savedInstanceState: Bundle?) {
		super.onActivityCreated(savedInstanceState)
		initViewModel()
		initTaskAction(savedInstanceState)
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/7 9:24 PM
	// 初始化 ViewModel 回调，在这里可以针对 ViewModel 做一些初始化
	///////////////////////////////////////////////////////////////////////////
	open fun initViewModel() {

	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/7 9:25 PM
	// 业务逻辑回调，在这里可以做一些业务相关初始化的逻辑
	///////////////////////////////////////////////////////////////////////////
	open fun initTaskAction(savedInstanceState: Bundle?) {

	}


	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/7 11:47 PM
	// 监控 onActivityResult 回调，如果当前 activityResultMap 存在对应 RequestCode，则将数据喂给对应的
	// ActivityResultDeferred
	///////////////////////////////////////////////////////////////////////////
	override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
		if (aware.onActivityResult(requestCode, resultCode, data)) {
			return
		}
		super.onActivityResult(requestCode, resultCode, data)
	}


	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/8 5:43 PM
	// 权限申请回调
	///////////////////////////////////////////////////////////////////////////
	override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
		if (aware.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
			return
		}
		super.onRequestPermissionsResult(requestCode, permissions, grantResults)
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/9 12:26 AM
	// 结果 Deferred
	///////////////////////////////////////////////////////////////////////////
	private var resultDeferred: CompletableDeferred<T?>? = null

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/9 12:27 AM
	// 显示页面，并返回 Deferred 结果
	///////////////////////////////////////////////////////////////////////////
	fun showWithResultAsync(manager: FragmentManager): Deferred<T?> {
		val deferred = CompletableDeferred<T?>()
		resultDeferred = deferred
		show(manager, null)
		return deferred
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/9 12:27 AM
	// 显示页面，并返回 Deferred 结果
	///////////////////////////////////////////////////////////////////////////
	fun showWithResultAsync(transaction: FragmentTransaction): Deferred<T?> {
		val deferred = CompletableDeferred<T?>()
		resultDeferred = deferred
		show(transaction, null)
		return deferred
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/9 2:35 PM
	// 返回缺省的 Deferred 结果
	///////////////////////////////////////////////////////////////////////////
	protected open fun getDefaultResult(): T? = null

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/9 12:28 AM
	// 设置结果，并关闭
	///////////////////////////////////////////////////////////////////////////
	protected fun setResultAndDismiss(result: T?) {
		resultDeferred?.complete(result)
		dismissAllowingStateLoss()
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/13 6:50 下午
	// 设置 Dialog 全屏
	///////////////////////////////////////////////////////////////////////////
	protected fun setDialogFullScreen(
		isFillWidth: Boolean = true,
		isFillHeight: Boolean = true,
		gravity: Int? = null
	) {
		val dialog = this.dialog ?: return
		val window: Window = dialog.window ?: return
		//去掉dialog的标题，需要在setContentView()之前
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
		//去掉dialog默认的padding
		//去掉dialog默认的padding
		window.decorView.setPadding(0, 0, 0, 0)
		val lp: WindowManager.LayoutParams = window.attributes
		if (isFillWidth) {
			lp.width = WindowManager.LayoutParams.MATCH_PARENT
		}
		if (isFillHeight) {
			lp.height = WindowManager.LayoutParams.MATCH_PARENT
		}
		if (gravity != null) {
			lp.gravity = gravity
		}
		window.attributes = lp
	}


	/**
	 * 判断是否为第一次进入到 Resume
	 */
	private var isFirstResume = false

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/12 11:45 下午
	// 监控 onCreate 回调
	///////////////////////////////////////////////////////////////////////////
	@CallSuper
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		isFirstResume = true
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/20 11:00 AM
	// 拦截 onResume 回调，根据条件判断触发 onFirstResume
	///////////////////////////////////////////////////////////////////////////
	@CallSuper
	override fun onResume() {
		super.onResume()
		if(isFirstResume) {
			isFirstResume = false
			onFirstResume()
		}
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/20 11:01 AM
	// 首次 Resume 回调
	///////////////////////////////////////////////////////////////////////////
	open fun onFirstResume() {

	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/6/9 12:22 AM
	// 监控 onDestroyView 回调，回收资源
	///////////////////////////////////////////////////////////////////////////
	override fun onDestroyView() {
		if (resultDeferred?.isCompleted == false) {
			resultDeferred?.complete(null)
		}
		cancel()
		aware.destroy()
		super.onDestroyView()
	}


	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/10/9 7:11 PM by CimZzz
	// 以下内容为:
	// 实现 ComponentAware.IComponentSupport 方法
	///////////////////////////////////////////////////////////////////////////

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/9 7:02 PM
	// 需要提供 startActivityForResult 方法
	///////////////////////////////////////////////////////////////////////////
	override fun supportStartActivityForResult(intent: Intent, reqCode: Int) {
		startActivityForResult(intent, reqCode)
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/9 7:07 PM
	// 需要提供请求权限方法
	///////////////////////////////////////////////////////////////////////////
	override fun supportRequestPermission(permissions: Array<out String>, reqCode: Int) {
		requestPermissions(permissions, reqCode)
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/9 7:09 PM
	// 需要提供 ViewModel 存储所有者
	///////////////////////////////////////////////////////////////////////////
	override fun supportViewModelStoreOwner(): ViewModelStoreOwner {
		return this
	}

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/9 7:20 PM
	// 需要提供 Activity
	///////////////////////////////////////////////////////////////////////////
	override fun supportBaseUI(): BaseUI? = activity as? BaseUI

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/11 6:03 PM
	// 需要提供协程域
	///////////////////////////////////////////////////////////////////////////
	override fun supportScope(): CoroutineScope = this

	///////////////////////////////////////////////////////////////////////////
	// Add by CimZzz on 2021/10/12 3:56 PM
	// 需要提供父 Fragment
	///////////////////////////////////////////////////////////////////////////
	override fun supportParentFragment(): BaseFragment? = parentFragment as? BaseFragment
}